package org.vison.framework.doc.web;

import lombok.Data;
import org.vison.framework.doc.annotation.DocLink;

import java.util.ArrayList;
import java.util.List;

/**
 * REST接口信息类
 * 存储解析到的REST接口详细信息
 */
@Data
public class ApiInfo {
    /**
     * 接口ID, 唯一标识一个接口 类名全路径+方法名 md5
     */
    private  String id;

    private String apiCategory;

    /**
     * API类型（rest或soa）
     */
    private String apiType;
    
    /**
     * 接口路径
     */
    private String path;
    
    /**
     * HTTP方法类型(GET, POST, PUT, DELETE等)
     */
    private String method;
    
    /**
     * 接口名称
     */
    private String name;
    
    /**
     * 接口描述
     */
    private String description;



    private List<DocLink> docLinks = new ArrayList<>();

    private String requestType;
    private String responseType;
    private List<ApiParam> requestHeaders = new ArrayList<>();
    private List<ApiParam> queryParams = new ArrayList<>();
    private List<ApiParam> pathParams = new ArrayList<>();
    private List<ApiParam> responseHeaders = new ArrayList<>();

    
    /**
     * 控制器类名
     */
    private String controllerClass;
    
    /**
     * 方法名
     */
    private String methodName;

    
    /**
     * 请求体字段信息
     */
    private ApiModel requestBodyModel;
    

    /**
     * 响应体字段信息
     */
    private ApiModel responseModel;


    private int order;

    /**
     * API模型类
     * 用于封装请求体和响应体的结构信息
     */
    @Data
    public static class ApiModel {
        /**
         * 模型参数列表
         */
        private List<ApiParam> params = new ArrayList<>();
        
        /**
         * 模型类型
         */
        private String type;
        
        /**
         * 添加单个参数到模型
         */
        public void addParam(ApiParam param) {
            this.params.add(param);
        }
        
        /**
         * 批量添加参数到模型
         */
        public void addParams(List<ApiParam> params) {
            this.params.addAll(params);
        }
    }
    

    
    /**
     * 统一的参数信息类
     * 用于描述API方法的参数、请求体字段和响应体字段信息
     * 整合了原ApiParam和FieldInfo的功能，支持更丰富的字段描述（包括版本、顺序等）
     */
    @Data
    public static class ApiParam {
        
        /**
         * 字段名称
         */
        private String name;
        
        /**
         * 字段类型
         */
        private String fullType;

        /**
         * 简单类型（如String、Integer等）
         */
        private String simpleType;
        
        /**
         * 字段描述
         */
        private String description;
        
        /**
         * 是否必需
         */
        private boolean required = false;
        
        /**
         * 默认值
         */
        private String defaultValue;
        
        /**
         * 示例值
         */
        private String example;
        
        /**
         * 引入版本
         */
        private String version = "1.0.0";
        
        /**
         * 嵌套字段列表
         * 如果字段是复杂对象类型，可以包含嵌套的字段信息
         */
        private List<ApiParam> nestedFields = new ArrayList<>();
        
        /**
         * 字段顺序
         */
        private int order = 0;
    }
}